#3.25 您在图3.38中看到中心为-8的拉普拉斯模板所得到的结果，要比中心为-4的模板所得到的结果清晰一些。详细说明其原因。
'''
答：通过学习我们知道，拉普拉斯算子是使用了二阶微分对图像进行锐化的，中心为-4
的拉普拉斯模板，模板的执行是看其水平方向和垂直方向上的微分比例。中心为-4的拉
普拉斯模板除了中心-4的上方和下放都是1，其余的位置都是0，即对角微分值为0。因此，
这个模板将只在一个方向上执行微分，并且忽略正交方向上的强度。也就是说，中心为
-4的拉普拉斯模板在处理图像锐化的过程中，水平和垂直方向上为1的拉普拉斯模板会
产生在两个方向上的锐化图像。
同理，中心为-8的拉普拉斯模板在中心-8位置的上方、下方以及对角处都是1，所以除了
在水平和垂直方向上进行锐化，还会对对角方向上的拉普拉斯模板进行锐化强度变化，
因此，在图3.38中看到中心为-8的拉普拉斯模板所得到的结果，要比中心为-4的模板
所得到的结果清晰一些。
'''


#3.26 参考习题3.25
#(a)若使用一个类似拉普拉斯的较大模板，如中心系数为-24的5*5模板，问是否可得到更加清晰的结果？详细解释一下。
#答：中心系数为-24的5*5模板，可以得到比中心系数为-8的3*3模板更加清晰的结果，过程如下代码所示。
from skimage import data
from matplotlib import pyplot as plt
import numpy as np
#图像空间滤波函数
def correl2d(img,window):
    m = window.shape[0]
    n = window.shape[1]
    #边界通过0灰度值填充扩展
    img1 = np.zeros((img.shape[0] + m - 1, img.shape[1] + n - 1))
    img1[(m - 1) // 2 :(img.shape[0] + (m - 1) // 2),
         (n - 1) // 2 :(img.shape[1] + (n - 1) // 2)] = img
    img2 = np.zeros(img.shape)
    for i in range(img2.shape[0]):
        for j in range(img2.shape[1]):
            temp = img1[i:i+m,j:j+n]
            img2[i,j] = np.sum(np.multiply(temp,window))
    return img2
#img为原始图像，window1为中心系数为-8的模板，window2中心系数为-24的模板
img = data.camera()
window1 = np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
window2=np.array([[1,1,1,1,1],[1,1,1,1,1],[1,1,-24,1,1],[1,1,1,1,1],[1,1,1,1,1]])

img_laplace1 = correl2d(img,window1)
img_laplace1 = 255*(img_laplace1 - img_laplace1.min())/(img_laplace1.max() - 
                   img_laplace1.min())
img_laplace2 = correl2d(img,window2)
img_laplace2 = 255*(img_laplace2 - img_laplace2.min())/(img_laplace2.max() - 
                   img_laplace2.min())
#将img和img_laplace相加得到锐化增强图像img_laplace
img_laplace_enhance1 = img + img_laplace1
img_laplace_enhance2 = img + img_laplace2

plt.figure()
plt.imshow(img_laplace_enhance1,cmap='gray') #显示中心系数为-8的模板图像处理结果
plt.figure()
plt.imshow(img_laplace_enhance2,cmap='gray') #显示中心系数为-24的模板图像处理结果


#(b)当该模板的大小与图像大小相等时，会发生什么情况？
#利用代码实现该假设，发现当模板的大小与图像大小相等时，图像周围锐化强度更大，图像变得模糊了。
window11 = np.ones((11,11))  # 创建全为1的数据框
window11[5,5] = -(11*11-1)   # 中心为-120
img1 = img[0:11,0:11]   # 大小为11×11的图像
img_laplace11 = correl2d(img1,window11)
img_laplace11 = 255*(img_laplace11 - img_laplace11.min())/(img_laplace11.max() - 
                   img_laplace11.min())
img_laplace_enhance11 = img1 + img_laplace11

# 显示图像
plt.figure()
plt.axis('off')
plt.imshow(img1)  #显示11×11的图像

plt.figure()
plt.axis('off')
plt.imshow(img_laplace_enhance11)  #显示中心为-120的图像


